home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
doc.exe
/
MQUEUE.DOC
< prev
next >
Wrap
Text File
|
1992-02-11
|
10KB
|
249 lines
─────────────────────────────────────────────────────────────────────────────
Dokumentation zur Datei: MQUEUE.INC
─────────────────────────────────────────────────────────────────────────────
MQUEUE.INC - Routinen zur Verwaltung einer Meldungsorientierten Queue
(für den Assembler A86)
(c) Bernd Schemmer 1992
Letzter Update: 02.02.1992
■ Beschreibung:
---------------
MQUEUE.INC stellt Routinen zur Verwaltung einer meldungsorientierten
Queue zur Verfügung. Eine Queue (oder auf deutsch: Schlange) ist eine
nach dem FIFO-Prinzip (First in, First out) organisierte Datenstruktur
zur Speicherung von Daten, in diesem Fall von Meldungen, wobei der
Inhalt der 'Meldungen' für die Routinen völlig unerheblich ist.
Jede Meldung belegt n Byte plus 1 Byte für die Verwaltungsstrukturen,
wobei n ein Wert im Intervall zwischen 0 und 255 ist.
Die Größe einer Queue, die durch diese Routinen verwaltet werden soll,
muß zwischen 256 und 65.535 Byte liegen.
Jede Queue beginnt immer mit einem 16 Byte großem Header auf einer
Segment-Grenze.
Die Routinen unterstützen auch die Einteilung von Meldungen in bis
zu 256 Klassen.
Jede Queue ist durch einen Semaphor vor gleichzeitiger Bearbeitung
durch mehrere Prozesse geschützt, wodurch die Queue auch durch
mehrere verschiedene Prozesse gefüllt und geleert werden kann.
Es ist auch möglich, eine Queue in eine Datei zu sichern und später
wieder zu laden, da die Routinen nur mit relativen Offsets arbeiten.
Es muß aber immer die gesamte Queue gesichert und geladen werden.
■ Variablen:
------------
MQueueSeg - Word, Segment der aktuellen Queue
Alle Routinen (außer InitMQueue) definieren einen zusätzlichen
Einsprungpunkt 'name_A'. (z.B. für 'LockMQueue' ist dies
'LockMQueue_A'). Falls die Routinen über diesen Einsprungpunkt
aufgerufen werden, arbeiten sie mit der Queue, deren Segment
in dieser Variable gespeichert ist. (Der Wert des Registers ES
beim Aufruf ist in diesen Fall ohne Bedeutung, das Register ES
wird aber NICHT gesichert.) Die Variable muß in diesem Fall
vorher auf einen korrekten Wert gesetzt worden sein! (z.B. durch
den Aufruf von 'InitMQueue' oder durch direktes Setzen)
Falls die Routinen über den normalen Einsprungpunkt aufgerufen
werden, wird diese Variable weder genutzt noch verändert.
MQueueSeg:[MQueueUserData1] - Word, für Benutzerzwecke reserviert
MQueueSeg:[MQueueUserData2] - Word, für Benutzerzwecke reserviert
An den Offsets MQueueUserData1 und MQueueUserData2 im Header
der Queue sind jeweils 2 Byte (= 1 Wort) für Daten des Programms
reserviert. Diese beiden Wörter werden von den Routinen zur
Verwaltung der Queue weder gelesen noch verändert (also auch
nicht mit einem bestimmten Wert initialisiert!).
(MQueueUserData1 und MQueueUserData2 sind über 'dw' definiert)
Alle anderen Variablen zur Verwaltung der Queue werden im Speicher-
bereich für die Queue angelegt und sollten von anderen Routinen
weder gelesen noch verändert werden.
■ Routinen:
-----------
InitMQueue - Initialisert (d.h. löscht) die Queue
LockMQueue - Sperrt eine Queue
UnLockMQueue - Gibt eine Queue wieder frei
DeleteMQueue - Löscht die gesamte Queue
WriteMQueue - Schreibt eine neue Meldung in die Queue
LookMQueue - Ermittelt die Länge und die Klasse der nächsten
Meldung aus der Queue
ReadMQueue - Liest die nächste Meldung aus der Queue
GetMQueueStatistik - Ermittelt die Daten der Queue
Da alle Variablen zur Verwaltung der Queue im Segment der Queue
angelegt werden, können die Routinen auch mit mehreren Queuen
gleichzeitig arbeiten.
Hinweis: Da nicht alle verwendeten Namen und Bezeichner dieser Datei
dokumentiert sind, sollten bei Nutzung dieser Routinen in
den anderen Quelltexten keine Namen oder Bezeichner, die
die Zeichenkette 'MQueue' enthalten, verwendet werden.
■ Fehlernummern der Routinen
----------------------------
Alle Fehlernummern der Routinen haben das Format 82xx, wobei xx die
Nummer des eigentlichen Fehlers ist.
Name Nummer Bedeutung
----------------------------------------------------------------------
MQueueIsEmpty EQU 08201h ; Es ist keine Meldung in der Queue
MQueueIsFull EQU 08202h ; Es ist nicht mehr genügend freier
; Speicher zur Aufnahme der neuen Meldung
; in der Queue frei
MQueueLengthError EQU 08203h ; falsche Größe für die Queue angegeben
MQueueBufferError EQU 08204h ; Puffer ist für die nächste Meldung zu
; klein
MQueueMessageError EQU 08205h ; Die Meldung ist zu lang
MQueueAktivError EQU 082FFh ; gleichzeigtiger Zugriff von mehreren
; Prozessen auf eine Queue nicht möglich
----------------------------
InitMQueue
Funktion: Initialisiert die Queue
Eingabe: ES = Segment für die Queue
Die Queue beginnt immer am Offset 0
CX = Größe des Speicherbereichs in Byte für die Queue
Es muß gelten: 256 < CX < 65.535
Ausgabe: CF = 0 ->> okay
CX = freier Speicher in der Queue
CF = 1 ->> Fehler
AX = Fehlernummer
Die Queue wurde NICHT eingerichtet.
Bes.: Das Segment der Queue wird, falls kein Fehler auftritt, in
der Variablen MQueueSeg gespeichert.
Der Wert des Semaphors der Queue wird NICHT berücksichtigt!
----------------------------
DeleteMQueue
Funktion: Löscht die gesamte Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CX = freier Speicher in der Queue
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
LockMQueue
Funktion: Sperrt eine Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
UnLockMQueue
Funktion: Gibt eine Queue wieder frei
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Der Wert des Semaphors der Queue wird NICHT berücksichtigt!
----------------------------
GetMQueueStatistik
Funktion: Ermittelt die statistischen Daten der Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CX = freier Speicher in der Queue
DX = Größe der Queue
AX = Anzahl der Meldungen in der Queue
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
WriteMQueue
Funktion: Schreibt eine Meldung in die Queue
Eingabe: ES = Segment der Queue
CX = Länge der Meldung
DS:SI -> Meldung
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
und falls AX = MQueueIsFull ist:
CX = max. Länge einer weiteren Meldung für die Queue
falls CX = -1 ->> keine weitere Meldung möglich
Bes.: Das Directionflag wird gelöscht.
----------------------------
LookMQueue
Funktion: Ermittelt die Daten der nächsten Meldung aus der Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CX = Länge der nächsten Meldung
und falls CX <> 0:
AL = 1. Byte der Meldung
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Die Klasse von Meldungen kann im 1. Byte einer Meldung
gesichert werden, da dieses Byte auch durch den Look-
Ahead-Aufruf zurückgeliefert wird.
Das Directionflag wird gelöscht.
----------------------------
ReadMQueue
Funktion: Liest die nächste Meldung aus der Queue
Eingabe: ES = Segment der Queue
CX = Länge des Puffers für die Meldung
DS:SI -> Puffer für die Meldung
Ausgabe: CF = 0 ->> okay
Meldung steht im Puffer bei DS:SI
CX = Länge der Meldung
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Falls diese Routine mit CX = 0 aufgerufen wird, verhält
sie sich wie die Routine 'LookMQueue'.
Falls der Puffer bei DS:SI für die Meldung zu klein ist,
wird die Meldung NICHT aus der Queue entfernt.
Das Directionflag wird gelöscht.